Administering computing resources can be a complex task. With servers, for example, each server may have required configurations and settings to prepare. These configurations should be balanced with proper security and redundancy. However, if, during this balancing, one of the server components is not linked together correctly, applications may not work optimally, if at all. For example, a web server may require database server communication information such as database hostname, database name, username and password. If the configuration information is incorrect or the permissions are incorrect, the web server may not be able to retrieve data from the database server.
Fault tolerance may also be a consideration for an administrator and developer. Redundancies may be built into the application and redundant servers provisioned. For example, the administrator may provision several databases with redundant data, in case of a failure. Unfortunately, redundancies may still fail if the redundancies share hardware that fails. However, having servers or other resources spread further apart may not be desirable because of an increase of latency and decrease of bandwidth. For example an application may have increased latency and appear slower because of too many network bottlenecks, possibly due to multiple routers. While various conventional techniques have been employed to effectively allocate computing resources, due to the complexity of the tasks, the employed techniques are of varied success.